import cv2
import numpy as np
import ezdxf


def image_to_dxf(image_path, dxf_path):

    # 读取图像
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    #图像反转
    flipped_image = cv2.flip(image, -1)
    flipped_image2 = cv2.flip(flipped_image, 1)

    if image is None:
        raise ValueError("无法读取图像文件")

    # image[image < 50] = 0

    blurred = cv2.GaussianBlur(flipped_image2, (3, 3), 0)
    # 使用阈值处理来二值化图像（如果需要进一步处理）
    _, thresholded = cv2.threshold(blurred, 211, 255, cv2.THRESH_BINARY)

    # 使用Canny边缘检测算法提取边缘
    edges = cv2.Canny(thresholded, 3, 20,apertureSize=7,L2gradient=True)

    # 找到轮廓

    # 简单找到轮廓点 这个文件相对小
    # contours, _ = cv2.findContours(edges, cv2.RETR_LIST ,cv2.CHAIN_APPROX_SIMPLE)

    # cv2.CHAIN_APPROX_NONE找到所有轮廓点  这个文件相对较大
    contours, _ = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
    # 创建新的DXF文档
    doc = ezdxf.new()
    msp = doc.modelspace()

    # 遍历轮廓并添加到DXF文件中
    for contour in contours:
        # 将轮廓的ndarray转换为列表的列表（每个子列表是一个(x, y)坐标对）
        points = contour.reshape(-1, 2).tolist()
        msp.add_polyline2d(points)

        # 保存DXF文件
    doc.saveas(dxf_path)


# 调用函数
#jpg png 都可以
image_to_dxf('templates\\test.png', 'output.dxf')